This code imports, cleans, and merges MODIS product data exported using the AppEEARS web application.

Exported MODIS data for the period 2000-2016:

Data was exported for 50 BAMS paper sites (.csv format, “ID”, “Category”, “LAT”, “LONG”)

9 MODIS products are downloaded in 5 .csv files:

[1] "./BAMS-Sites-MOD11A2-006-results.csv"  "./BAMS-Sites-MOD13Q1-006-results.csv"  "./BAMS-Sites-MOD15A2H-006-results.csv"
[4] "./BAMS-Sites-MOD16A2-006-results.csv"  "./BAMS-Sites-MOD17A2H-006-results.csv"
[[1]]

[[2]]

[[3]]

[[4]]

[[5]]
NA

Simplify data by removing unnecssary fields:

$lst_day

$vi

$lai

$et

$gpp

$lst_night
NA

Look at what the data quality levels are, convert good to 1, keep only 1s

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

Make a plot of daytime LST to make sure things look OK

ggplot(modis.filtered[[1]], aes(DATE, LST_D, col = as.factor(LAT))) +
  geom_point()

Create a dataframe for each product consisting of LAT, LONG, DATE and the product field (e.g. LST_D)

lst_d.filtered <- modis.filtered$lst_day %>% mutate(LST_D = LST_D) %>% select(LAT, LONG, DATE, LST_D)
lst_n.filtered <- modis.filtered$lst_night %>% mutate(LST_N = LST_N) %>% select(LAT, LONG, DATE, LST_N)
evi.filtered <- modis.filtered$vi %>% mutate(EVI = EVI) %>% select(LAT, LONG, DATE, EVI)
ndvi.filtered <- modis.filtered$vi  %>% mutate(NDVI = NDVI) %>% select(LAT, LONG, DATE, NDVI)
fpar.filtered <- modis.filtered$lai  %>% mutate(FPAR = FPAR) %>% select(LAT, LONG, DATE, FPAR)
lai.filtered <- modis.filtered$lai  %>% mutate(LAI = LAI) %>% select(LAT, LONG, DATE, LAI)
gpp.filtered <- modis.filtered$gpp %>% mutate(GPP = GPP) %>% select(LAT, LONG, DATE, GPP) 
le.filtered <- modis.filtered$et %>% mutate(LE = LE) %>%  select(LAT, LONG, DATE, LE) 
pet.filtered <- modis.filtered$et %>% mutate(PET = PET) %>% select(LAT, LONG, DATE, PET) 

Create a full dataframe with each site name/latlong repeated n = length(2000-01-01 to 2018-12-31) (MODIS data window). Then right_join each modis product to the site name/all dates tibble to produce a complete dataframe of modis data.

full.date <- as_tibble(rep(as_date(c(as_date("2000-01-01"):as_date("2018-12-31"))),50))
names(full.date) <- "DATE"
full.date <- full.date %>% add_column(ID = rep(bams.sites$ID, each = length(full.date$DATE)/50)) %>% 
                              add_column(LAT = rep(bams.sites$LAT, each = length(full.date$DATE)/50)) %>%
                                add_column(LONG = rep(bams.sites$LONG, each = length(full.date$DATE)/50))
modis.full <- right_join(full.date, lst_d.filtered, by =c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, lst_n.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, evi.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, ndvi.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, fpar.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, lai.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, gpp.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, le.filtered, by=c("DATE","LAT","LONG"))
modis.full <- right_join(modis.full, pet.filtered, by=c("DATE","LAT","LONG"))
modis.full <- left_join(modis.full, bams.sites, by=c("LAT", "LONG"))
modis.full <- modis.full %>% select(ID = ID.y, Category, -ID.x, LAT, LONG, DATE, LST_D, LST_N, EVI, NDVI, FPAR, LAI, GPP, LE, PET)
str(modis.full)
Classes ‘tbl_df’, ‘tbl’ and 'data.frame':   203430 obs. of  14 variables:
 $ ID      : Factor w/ 50 levels "BCBog","BCFEN",..: 13 13 13 13 13 13 13 13 13 13 ...
 $ Category: Factor w/ 5 levels "CRO_OTHER","CRO_RICE",..: 1 1 1 1 1 1 1 1 1 1 ...
 $ LAT     : num  27.2 27.2 27.2 27.2 27.2 ...
 $ LONG    : num  -81.2 -81.2 -81.2 -81.2 -81.2 ...
 $ DATE    : Date, format: "2001-01-01" "2001-01-09" "2001-01-17" "2001-01-25" ...
 $ LST_D   : num  297 NA 298 NA NA ...
 $ LST_N   : num  278 NA 280 NA NA ...
 $ EVI     : num  0.208 NA 0.194 NA 0.184 ...
 $ NDVI    : num  0.331 NA 0.323 NA 0.333 ...
 $ FPAR    : num  0.36 0.33 0.33 0.36 0.3 ...
 $ LAI     : num  0.5 0.7 0.7 0.8 0.6 ...
 $ GPP     : num  0.0121 0.0153 0.0135 0.0158 0.0156 ...
 $ LE      : num  2430000 1820000 2020000 1800000 32765 ...
 $ PET     : num  75.6 26.6 27.1 30.4 32765 ...
modis.full

Finished! Save as .csv

# set wd
setwd("C:/Users/Gavin McNicol/Box Sync/MODIS Data/AppEEARS Data")
write.csv(modis.full, "bams_sites_MODIS_full.csv")
LS0tDQp0aXRsZTogIlByZXBhcmUgTU9ESVMgRGF0YSINCm91dHB1dDogaHRtbF9ub3RlYm9vaw0KLS0tDQoNClRoaXMgY29kZSBpbXBvcnRzLCBjbGVhbnMsIGFuZCBtZXJnZXMgTU9ESVMgcHJvZHVjdCBkYXRhIGV4cG9ydGVkIHVzaW5nIHRoZSBbQXBwRUVBUlNdKGh0dHBzOi8vbHBkYWFjc3ZjLmNyLnVzZ3MuZ292L2FwcGVlYXJzKSB3ZWIgYXBwbGljYXRpb24uDQoNCkV4cG9ydGVkIE1PRElTIGRhdGEgZm9yIHRoZSBwZXJpb2QgMjAwMC0yMDE2Og0KDQoqICoqTU9EMTFBMjoqKiBMU1QgRGF5IDFrbSAmIExTVCBOaWdodCAxa20gKDggZGF5KQ0KKiAqKk1PRDEzUTE6KiogRVZJIDI1MG0gJiBORFZJIDI1MG0gKDE2IGRheSkNCiogKipNT0QxNUEySDoqKiBmUEFSIDUwMG0gJiBMQUkgNTAwbSAoOCBkYXkpDQoqICoqTU9EMTZBMjoqKiBMRSA1MDBtICYgUEVUIDUwMG0gKDggZGF5KQ0KKiAqKk1PRDE3QTJIOioqIEdQUCA1MDBtICg4IGRheSkNCg0KRGF0YSB3YXMgZXhwb3J0ZWQgZm9yIDUwIEJBTVMgcGFwZXIgc2l0ZXMgKC5jc3YgZm9ybWF0LCAiSUQiLCAiQ2F0ZWdvcnkiLCAiTEFUIiwgIkxPTkciKQ0KYGBge3IgZWNobz1GQUxTRSwgd2FybmluZz1GQUxTRSwgbWVzc2FnZT1GQUxTRX0NCiMgY2xlYXIgd29ya3NwYWNlIGFuZCBnZXQgd2QNCnJtKGxpc3Q9bHMoKSkNCiMgY2hhbmdlIHdkDQpzZXR3ZCgiQzovVXNlcnMvR2F2aW4gTWNOaWNvbC9Cb3ggU3luYy9NT0RJUyBEYXRhL0FwcEVFQVJTIERhdGEvIikNCmJhbXMuc2l0ZXMgPC0gcmVhZC5jc3YoIkFwcEVFQVJTX3NpdGVzLmNzdiIpDQpuYW1lcyhiYW1zLnNpdGVzKVtjKDMsNCldIDwtIGMoIkxBVCIsICJMT05HIikNCmJhbXMuc2l0ZXMNCmBgYA0KDQoNCmBgYHtyIGVjaG89RkFMU0V9DQojIGxpYnJhcmllcw0KIyBsb2FkIHRpZHl2ZXJzZSBsaWJyYXJpZXMNCmxpYnJhcnkoZHBseXIpDQpsaWJyYXJ5KHRpZHlyKQ0KbGlicmFyeShyZWFkcikNCmxpYnJhcnkocmVhZHhsKQ0KbGlicmFyeShzdHJpbmdyKQ0KbGlicmFyeShsdWJyaWRhdGUpDQpsaWJyYXJ5KFJDb2xvckJyZXdlcikNCmxpYnJhcnkoZ2dwbG90MikNCmxpYnJhcnkoZGF0YS50YWJsZSkNCmxpYnJhcnkobWFncml0dHIpDQpsaWJyYXJ5KGNhcmV0KQ0KbGlicmFyeShjYVRvb2xzKQ0KbGlicmFyeShyYW5nZXIpDQpsaWJyYXJ5KHRpYmJsZSkNCmBgYA0KDQo5IE1PRElTIHByb2R1Y3RzIGFyZSBkb3dubG9hZGVkIGluIDUgLmNzdiBmaWxlczoNCmBgYHtyIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0UsIGVjaG89RkFMU0V9DQojIGNoYW5nZSB3ZA0Kc2V0d2QoIkM6L1VzZXJzL0dhdmluIE1jTmljb2wvQm94IFN5bmMvTU9ESVMgRGF0YS9BcHBFRUFSUyBEYXRhL2JhbXMtc2l0ZXMiKQ0KIyBnZXQgc2l0ZSBuYW1lcyBmcm9tIGRpcmVjdG9yeQ0Kc2l0ZS5uYW1lcyA8LSBsaXN0LmZpbGVzKHBhdHRlcm4gPSAiXFwuY3N2JCIsZnVsbC5uYW1lcz1UUlVFKQ0Kc2l0ZS5uYW1lcw0KICAjIGNyZWF0ZSBsaXN0IG9mIHByb2R1Y3RzDQptb2RpcyA8LSBsaXN0KCkNCiMgY3JlYXRlIGEgZnVuY3Rpb24gdG8gcmVhZCBtYW55IGNzdnMNCnJlYWQubWFueS5jc3YgPC0gZnVuY3Rpb24oaSl7DQogIHJlYWQuY3N2KGksIGhlYWRlcj1UUlVFKQ0KfQ0KIyBleGVjdXRlIGZ1bmN0aW9uIHdpdGggc2l0ZS5uYW1lcw0KbW9kaXMgPC0gbGFwcGx5KHNpdGUubmFtZXMsIHJlYWQubWFueS5jc3YpDQptb2Rpcw0KYGBgDQpTaW1wbGlmeSBkYXRhIGJ5IHJlbW92aW5nIHVubmVjc3NhcnkgZmllbGRzOg0KYGBge3IgZWNobyA9IEZBTFNFfQ0KbHN0Lm5hbWVzIDwtIG5hbWVzKG1vZGlzW1sxXV1bYygzLDQsNSw5LDEwLDE1LDI0KV0pIA0KdmkubmFtZXMgPC0gbmFtZXMobW9kaXNbWzJdXVtjKDMsNCw1LDksMTAsMTQpXSkNCmxhaS5uYW1lcyA8LSBuYW1lcyhtb2Rpc1tbM11dW2MoMyw0LDUsOSwxMCwxNCldKQ0KZXQubmFtZXMgPC0gbmFtZXMobW9kaXNbWzRdXVtjKDMsNCw1LDksMTAsMTQpXSkNCmdwcC5uYW1lcyA8LSBuYW1lcyhtb2Rpc1tbNV1dW2MoMyw0LDUsOSwxMyldKQ0KbmFtZXMudmVjIDwtIGxpc3QobHN0Lm5hbWVzLHZpLm5hbWVzLCBsYWkubmFtZXMsIGV0Lm5hbWVzLCBncHAubmFtZXMpDQptb2Rpcy5zaW1wbGUgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kaXMpKXsNCiAgICAgbW9kaXMuc2ltcGxlW1tpXV0gPC0gYXNfdGliYmxlKG1vZGlzW1tpXV1bbmFtZXMudmVjW1tpXV1dKQ0KICAgICBtb2Rpcy5zaW1wbGVbW2ldXSREYXRlIDwtIGFzX2RhdGUobW9kaXMuc2ltcGxlW1tpXV0kRGF0ZSkNCn0NCiNzcGxpdCBuaWdodCBhbmQgZGF5IExTVDsgZXZpIGFuZCBORFZJOyBMQUkgYW5kIGZQQVIuDQptb2Rpcy5zaW1wbGVbWzZdXSA8LSBtb2Rpcy5zaW1wbGVbWzFdXSAlPiUgc2VsZWN0KExhdGl0dWRlLCBMb25naXR1ZGUsIERhdGUsIE1PRDExQTJfMDA2X0xTVF9OaWdodF8xa20sIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNT0QxMUEyXzAwNl9RQ19OaWdodF9NT0RMQU5EX0Rlc2NyaXB0aW9uKQ0KbW9kaXMuc2ltcGxlW1sxXV0gPC0gbW9kaXMuc2ltcGxlW1sxXV0gJT4lIHNlbGVjdChMYXRpdHVkZSwgTG9uZ2l0dWRlLCBEYXRlLCBNT0QxMUEyXzAwNl9MU1RfRGF5XzFrbSwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTU9EMTFBMl8wMDZfUUNfRGF5X01PRExBTkRfRGVzY3JpcHRpb24pDQpuYW1lcyhtb2Rpcy5zaW1wbGUpIDwtIGMoImxzdF9kYXkiLCJ2aSIsImxhaSIsImV0IiwiZ3BwIiwibHN0X25pZ2h0IikNCm1vZGlzLnNpbXBsZQ0KYGBgDQpMb29rIGF0IHdoYXQgdGhlIGRhdGEgcXVhbGl0eSBsZXZlbHMgYXJlLCBjb252ZXJ0IGdvb2QgdG8gMSwga2VlcCBvbmx5IDFzDQpgYGB7ciBlY2hvPSBGQUxTRX0NCiNjb252ZXJ0IGxldmVscyB0byBmYWN0b3INCmxldmVscyhtb2Rpcy5zaW1wbGVbWzFdXVtbNV1dKSA8LSBhcy5mYWN0b3IoYygwLDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1syXV1bWzZdXSkgPC0gYXMuZmFjdG9yKGMoMCwwLDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1szXV1bWzZdXSkgPC0gYXMuZmFjdG9yKGMoMSwwKSkNCmxldmVscyhtb2Rpcy5zaW1wbGVbWzRdXVtbNl1dKSA8LSBhcy5mYWN0b3IoYygxLDApKQ0KbGV2ZWxzKG1vZGlzLnNpbXBsZVtbNV1dW1s1XV0pIDwtIGFzLmZhY3RvcihjKDEsMCkpDQpsZXZlbHMobW9kaXMuc2ltcGxlW1s2XV1bWzVdXSkgPC0gYXMuZmFjdG9yKGMoMCwxLDApKQ0KI3JlbmFtZSB2YXJpYWJsZXMNCm5hbWVzKG1vZGlzLnNpbXBsZVtbMV1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxTVF9EIiwgIlFVQUxJVFkiKQ0KbmFtZXMobW9kaXMuc2ltcGxlW1syXV0pIDwtIGMoIkxBVCIsICJMT05HIiwgIkRBVEUiLCAiRVZJIiwgIk5EVkkiLCAiUVVBTElUWSIpDQpuYW1lcyhtb2Rpcy5zaW1wbGVbWzNdXSkgPC0gYygiTEFUIiwgIkxPTkciLCAiREFURSIsICJGUEFSIiwgIkxBSSIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNF1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxFIiwgIlBFVCIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNV1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkdQUCIsICJRVUFMSVRZIikNCm5hbWVzKG1vZGlzLnNpbXBsZVtbNl1dKSA8LSBjKCJMQVQiLCAiTE9ORyIsICJEQVRFIiwgIkxTVF9OIiwgIlFVQUxJVFkiKQ0KIyBtb2Rpcy5zaW1wbGUNCg0KbW9kaXMuZmlsdGVyZWQgPC0gbGlzdCgpDQpmb3IgKGkgaW4gMTpsZW5ndGgobW9kaXMuc2ltcGxlKSl7DQogIG1vZGlzLmZpbHRlcmVkW1tpXV0gPC0gYXNfdGliYmxlKG1vZGlzLnNpbXBsZVtbaV1dICU+JSBmaWx0ZXIoUVVBTElUWSA9PSAxKSkNCn0NCm1vZGlzLmZpbHRlcmVkDQpuYW1lcyhtb2Rpcy5maWx0ZXJlZCkgPC0gYygibHN0X2RheSIsInZpIiwibGFpIiwiZXQiLCJncHAiLCJsc3RfbmlnaHQiKQ0KYGBgDQpNYWtlIGEgcGxvdCBvZiBkYXl0aW1lIExTVCB0byBtYWtlIHN1cmUgdGhpbmdzIGxvb2sgT0sNCmBgYHtyfQ0KZ2dwbG90KG1vZGlzLmZpbHRlcmVkW1sxXV0sIGFlcyhEQVRFLCBMU1RfRCwgY29sID0gYXMuZmFjdG9yKExBVCkpKSArDQogIGdlb21fcG9pbnQoKQ0KYGBgDQpDcmVhdGUgYSBkYXRhZnJhbWUgZm9yIGVhY2ggcHJvZHVjdCBjb25zaXN0aW5nIG9mIExBVCwgTE9ORywgREFURSBhbmQgdGhlIHByb2R1Y3QgZmllbGQgKGUuZy4gTFNUX0QpDQpgYGB7cn0NCmxzdF9kLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGxzdF9kYXkgJT4lIG11dGF0ZShMU1RfRCA9IExTVF9EKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgTFNUX0QpDQpsc3Rfbi5maWx0ZXJlZCA8LSBtb2Rpcy5maWx0ZXJlZCRsc3RfbmlnaHQgJT4lIG11dGF0ZShMU1RfTiA9IExTVF9OKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgTFNUX04pDQpldmkuZmlsdGVyZWQgPC0gbW9kaXMuZmlsdGVyZWQkdmkgJT4lIG11dGF0ZShFVkkgPSBFVkkpICU+JSBzZWxlY3QoTEFULCBMT05HLCBEQVRFLCBFVkkpDQpuZHZpLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJHZpICAlPiUgbXV0YXRlKE5EVkkgPSBORFZJKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgTkRWSSkNCmZwYXIuZmlsdGVyZWQgPC0gbW9kaXMuZmlsdGVyZWQkbGFpICAlPiUgbXV0YXRlKEZQQVIgPSBGUEFSKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgRlBBUikNCmxhaS5maWx0ZXJlZCA8LSBtb2Rpcy5maWx0ZXJlZCRsYWkgICU+JSBtdXRhdGUoTEFJID0gTEFJKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgTEFJKQ0KZ3BwLmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGdwcCAlPiUgbXV0YXRlKEdQUCA9IEdQUCkgJT4lIHNlbGVjdChMQVQsIExPTkcsIERBVEUsIEdQUCkgDQpsZS5maWx0ZXJlZCA8LSBtb2Rpcy5maWx0ZXJlZCRldCAlPiUgbXV0YXRlKExFID0gTEUpICU+JSAgc2VsZWN0KExBVCwgTE9ORywgREFURSwgTEUpIA0KcGV0LmZpbHRlcmVkIDwtIG1vZGlzLmZpbHRlcmVkJGV0ICU+JSBtdXRhdGUoUEVUID0gUEVUKSAlPiUgc2VsZWN0KExBVCwgTE9ORywgREFURSwgUEVUKSANCmBgYA0KQ3JlYXRlIGEgZnVsbCBkYXRhZnJhbWUgd2l0aCBlYWNoIHNpdGUgbmFtZS9sYXRsb25nIHJlcGVhdGVkIG4gPSBsZW5ndGgoMjAwMC0wMS0wMSB0byAyMDE4LTEyLTMxKSAoTU9ESVMgZGF0YSB3aW5kb3cpLg0KVGhlbiByaWdodF9qb2luIGVhY2ggbW9kaXMgcHJvZHVjdCB0byB0aGUgc2l0ZSBuYW1lL2FsbCBkYXRlcyB0aWJibGUgdG8gcHJvZHVjZSBhIGNvbXBsZXRlIGRhdGFmcmFtZSBvZiBtb2RpcyBkYXRhLg0KYGBge3J9DQpmdWxsLmRhdGUgPC0gYXNfdGliYmxlKHJlcChhc19kYXRlKGMoYXNfZGF0ZSgiMjAwMC0wMS0wMSIpOmFzX2RhdGUoIjIwMTgtMTItMzEiKSkpLDUwKSkNCm5hbWVzKGZ1bGwuZGF0ZSkgPC0gIkRBVEUiDQpmdWxsLmRhdGUgPC0gZnVsbC5kYXRlICU+JSBhZGRfY29sdW1uKElEID0gcmVwKGJhbXMuc2l0ZXMkSUQsIGVhY2ggPSBsZW5ndGgoZnVsbC5kYXRlJERBVEUpLzUwKSkgJT4lIA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2NvbHVtbihMQVQgPSByZXAoYmFtcy5zaXRlcyRMQVQsIGVhY2ggPSBsZW5ndGgoZnVsbC5kYXRlJERBVEUpLzUwKSkgJT4lDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFkZF9jb2x1bW4oTE9ORyA9IHJlcChiYW1zLnNpdGVzJExPTkcsIGVhY2ggPSBsZW5ndGgoZnVsbC5kYXRlJERBVEUpLzUwKSkNCg0KDQptb2Rpcy5mdWxsIDwtIHJpZ2h0X2pvaW4oZnVsbC5kYXRlLCBsc3RfZC5maWx0ZXJlZCwgYnkgPWMoIkRBVEUiLCJMQVQiLCJMT05HIikpDQptb2Rpcy5mdWxsIDwtIHJpZ2h0X2pvaW4obW9kaXMuZnVsbCwgbHN0X24uZmlsdGVyZWQsIGJ5PWMoIkRBVEUiLCJMQVQiLCJMT05HIikpDQptb2Rpcy5mdWxsIDwtIHJpZ2h0X2pvaW4obW9kaXMuZnVsbCwgZXZpLmZpbHRlcmVkLCBieT1jKCJEQVRFIiwiTEFUIiwiTE9ORyIpKQ0KbW9kaXMuZnVsbCA8LSByaWdodF9qb2luKG1vZGlzLmZ1bGwsIG5kdmkuZmlsdGVyZWQsIGJ5PWMoIkRBVEUiLCJMQVQiLCJMT05HIikpDQptb2Rpcy5mdWxsIDwtIHJpZ2h0X2pvaW4obW9kaXMuZnVsbCwgZnBhci5maWx0ZXJlZCwgYnk9YygiREFURSIsIkxBVCIsIkxPTkciKSkNCm1vZGlzLmZ1bGwgPC0gcmlnaHRfam9pbihtb2Rpcy5mdWxsLCBsYWkuZmlsdGVyZWQsIGJ5PWMoIkRBVEUiLCJMQVQiLCJMT05HIikpDQptb2Rpcy5mdWxsIDwtIHJpZ2h0X2pvaW4obW9kaXMuZnVsbCwgZ3BwLmZpbHRlcmVkLCBieT1jKCJEQVRFIiwiTEFUIiwiTE9ORyIpKQ0KbW9kaXMuZnVsbCA8LSByaWdodF9qb2luKG1vZGlzLmZ1bGwsIGxlLmZpbHRlcmVkLCBieT1jKCJEQVRFIiwiTEFUIiwiTE9ORyIpKQ0KbW9kaXMuZnVsbCA8LSByaWdodF9qb2luKG1vZGlzLmZ1bGwsIHBldC5maWx0ZXJlZCwgYnk9YygiREFURSIsIkxBVCIsIkxPTkciKSkNCm1vZGlzLmZ1bGwgPC0gbGVmdF9qb2luKG1vZGlzLmZ1bGwsIGJhbXMuc2l0ZXMsIGJ5PWMoIkxBVCIsICJMT05HIikpDQptb2Rpcy5mdWxsIDwtIG1vZGlzLmZ1bGwgJT4lIHNlbGVjdChJRCA9IElELnksIENhdGVnb3J5LCAtSUQueCwgTEFULCBMT05HLCBEQVRFLCBMU1RfRCwgTFNUX04sIEVWSSwgTkRWSSwgRlBBUiwgTEFJLCBHUFAsIExFLCBQRVQpDQoNCnN0cihtb2Rpcy5mdWxsKQ0KbW9kaXMuZnVsbA0KYGBgDQoNCkZpbmlzaGVkISBTYXZlIGFzIC5jc3YNCmBgYHtyIHdhcm5pbmc9RkFMU0UsIG1lc3NhZ2U9RkFMU0V9DQojIHNldCB3ZA0Kc2V0d2QoIkM6L1VzZXJzL0dhdmluIE1jTmljb2wvQm94IFN5bmMvTU9ESVMgRGF0YS9BcHBFRUFSUyBEYXRhIikNCndyaXRlLmNzdihtb2Rpcy5mdWxsLCAiYmFtc19zaXRlc19NT0RJU19mdWxsLmNzdiIpDQpgYGANCg0KDQoNCg0K